import java.io.*;
import java.util.Arrays;
import java.util.Comparator;

public class FileCombiner {

    private Comparator<File> comparator ;

    private FileCombiner(){
        super();
    }

    /**
     * 用来获取 文件合并器 的 静态工厂方法
     * @param comparator 表示用来对列表中的文件进行排序的比较器
     */
    public static FileCombiner getInstance( Comparator<File> comparator ){
        FileCombiner fileCombiner = new FileCombiner();
        fileCombiner.comparator = comparator;
        return fileCombiner;
    }

    public static FileCombiner getInstance(){
        Comparator<File> comparator = new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return o1.compareTo(o2);//如果返回1，则说明o1 > o2；如果返回0，则说明o1 = o2；如果返回1，则说明o1 < o2
            }
        };
        return getInstance( comparator ); // 调用另外一个 getInstance 方法
    }

    /**
     * 将第一个参数对应的目录下的文件合并后，保存到第二个参数对应的位置
     * @param path 需要被合并的众多小文件的存放目录
     * @param dest 合并后的大文件的存放位置
     */
    public void combine( File path , File dest ) throws IOException{
        // 获取到文件列表后，要对文件列表进行排序 ( 使用 comparator 完成排序 )
        if( !path.exists() || !path.isDirectory() ) {
            throw new IllegalArgumentException( "合并的文件目录不存在或不是有效目录！" );
        }

        if( !dest.exists() || !dest.isDirectory() ) {
            throw new IllegalArgumentException( "目标目录不存在或不是有效目录！" );
        }
        File[] files = path.listFiles();
        Arrays.sort( files , comparator);
        int i = files.length - 1;

        String s = "";
        while( true ) {
            InputStream in = new FileInputStream(path + "/" +files[i].getName());
            int size = (int) files[i].length();
            byte[] b = new byte[size];
            in.read(b);
            in.close();

            s = new String(b) + s;

            i--;
            if (i == -1){
                break;
            }
        }

        final byte[] bytes = s.getBytes();
        String name = files[0].getName();
        int index = name.indexOf(".");
        String filename = name.substring( 0 , index-3);
        String y = name.substring( index );
        File f = new File( dest , filename );

        OutputStream out = new FileOutputStream( f + y );
        out.write(bytes);
        out.close();
        System.out.println( "合并成功！" );
    }

    public static void main( String[] args ) throws IOException{

        File path = new File( "D:/test/" ) ;
        File dest = new File( "D:/test/" ) ;

        FileCombiner fc = FileCombiner.getInstance(); // 默认根据文件名称对文件列表排序

        fc.combine( path , dest );

    }

}
